package curso.maven.cidades.persistencia.hibernate;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;

import curso.maven.cidades.negocio.Cidade;
import curso.maven.cidades.negocio.RepositorioCidades;

public class RepositorioCidadesHibernate implements RepositorioCidades {
	private SessionFactory fabricaSessaoHibernate;
	
	public RepositorioCidadesHibernate(SessionFactory fabricaSessaoHibernate) {
		if (fabricaSessaoHibernate == null) {
			throw new NullPointerException("FabricaSessaoHibernate nao pode ser NULL");
		}
		this.fabricaSessaoHibernate = fabricaSessaoHibernate;
	}

	@Override
	public Cidade recuperarCidadePorCodigo(String codigo) {
		Session sessaoHibernate = fabricaSessaoHibernate.getCurrentSession();
		return (Cidade) sessaoHibernate.get(Cidade.class, codigo);
	}

	@Override
	@SuppressWarnings({ "unchecked" })
	public List<Cidade> listarCidadesPorNome(String nome) {
		Session sessaoHibernate = fabricaSessaoHibernate.getCurrentSession();
		Criteria selecaoCidades = sessaoHibernate.createCriteria(Cidade.class);
		if (nome != null && !nome.trim().isEmpty()) {
			selecaoCidades.add(Restrictions.ilike("nome", nome, MatchMode.ANYWHERE));
		}
		List<Cidade> cidades = selecaoCidades.list();
		return cidades;
	}

	@Override
	@SuppressWarnings({ "unchecked" })
	public List<Cidade> listarCidadesPorUf(String uf) {
		Session sessaoHibernate = fabricaSessaoHibernate.getCurrentSession();
		Criteria selecaoCidades = sessaoHibernate.createCriteria(Cidade.class);
		selecaoCidades.add(Restrictions.eq("uf", uf.toUpperCase()));
		List<Cidade> cidades = selecaoCidades.list();
		return cidades;
	}
}
